Ya hemos iniciado nuestro camino por el universo de R y la Ciencia de Datos.
En el libro R para la Ciencia de Datos, Hadley Wickham y Garrett Grolemund dicen que un típico proyecto de ciencia de datos se ve así:
Fuente: Wickham y Grolemund - R para Ciencia de Datos
Dentro de ese workflow, ahora estamos aprendiendo los primeros tres pasos. En inglés, la jerga para estos pasos se conoce como data wrangling, aunque en castellano podríamos estar hablando de domar los datos.
Domar involucra el 80% del tiempo en un proyecto, y puede dividirse en tres etapas (o dos si damos por sentado que siempre tendremos que importar datos):
La importación de los datos (independientemente de donde esten almacenados).
Ordenar los archivos. Esto implica guardarlos de una forma consistente que haga coincidir la semántica del set de datos con la manera en que está guardado. Para ello los autores hablan de tidy data, de ahí el nombre de nuestro amigo tidyverse (algo así como universo ordenado). Básicamente tidyverse propone que los datos estén ordenados, y el formato sería: cada columna es una variable y cada fila una observación. Este orden nos va a permitir enfocarnos en lo importante, que es hacer las preguntas que nos importan.
Una vez que nuestros datos están ordenados, debemos transformarlos. La transformación implica reducir las observaciones a aquellas que sean de interés (como todas las personas de una ciudad o todos los datos del último año), crear nuevas variables que sean funciones de variables ya existentes (como calcular la rapidez a partir de la velocidad y el tiempo) y calcular una serie de estadísticos de resumen (como recuentos y medias).
Fuente: Wickham y Grolemund - R para Ciencia de Datos
Antes de empezar a ver como transformamos estas bases de datos, debemos entender un concepto fundamental que es el de una base de datos “tidy”.
Cuando hablamos de datos “ordenados” , o “tidy”, o en formato “largo”, nos referimos a aquellos set de datos en los cuales:
Fuente: Wickham y Grolemund - R para Ciencia de Datos
¿Por qué asegurarse tidy? Dos ventajas principales:
Hoy aprenderemos algunas técnicas fundamentales para la transformación de datos. Estas funciones provienen del tidyverse, y principalmente apuntan a unir, pegar, cortar y transformar tablas:
bind_rows(): combinar casosbind_cols(): combinar variables_join()pivot_longer() / gather(): de ancho a
largopivot_wider() / spread(): de largo a
anchoBind rows nos permite COMBINAR CASOS.
Si no tienen la misma cantidad de columnas (y con diferentes nombres) nos crea esa columna con NA’s.
El comando a utilizar sería
nueva_base <- bind_rows(x,y)
Fuente: Cheatsheet dplyr
mutate().Bind rows nos permite combinar VARIABLES
nueva_base <- bind_cols(x,y)
Fuente: Cheatsheet dplyr
IMPORTANTE: Da error si las bases a unir no tienen el mismo largo (cantidad de filas).
IMPORTANTE: asegurarse que las filas coincidan. Por ejemplo, si unimos dos bases, deberíamos procurar que la fila 1 de la tabla que unimos sea también la fila 1 de la tabla con la que haremos bind_cols(), sino vamos a tener casos mezclados!!
Utilizaremos unas bases de datos de las elecciones 2021 celebradas en CABA
#Importar librerias
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✔ ggplot2 3.3.5 ✔ purrr 0.3.4
## ✔ tibble 3.1.6 ✔ dplyr 1.0.8
## ✔ tidyr 1.2.0 ✔ stringr 1.4.0
## ✔ readr 2.1.2 ✔ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
#Importar data
caba_generales <- read_csv("DATA/caba_grales21.csv") %>%
print() #solo para chequear e inspeccionar datos
## Rows: 321103 Columns: 22
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (12): eleccion_tipo, recuento_tipo, padron_tipo, distrito_nombre, seccio...
## dbl (7): año, distrito_id, seccion_id, mesa_electores, agrupacion_id, lista...
## lgl (3): seccionprovincial_id, seccionprovincial_nombre, circuito_nombre
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
## # A tibble: 321,103 × 22
## año eleccion_tipo recuento_tipo padron_tipo distrito_id distrito_nombre
## <dbl> <chr> <chr> <chr> <dbl> <chr>
## 1 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## 2 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## 3 2021 PASO PROVISORIO COMANDO 1 CIUDAD AUTÓNOMA DE…
## 4 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## 5 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## 6 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## 7 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## 8 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## 9 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## 10 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## # … with 321,093 more rows, and 16 more variables: seccionprovincial_id <lgl>,
## # seccionprovincial_nombre <lgl>, seccion_id <dbl>, seccion_nombre <chr>,
## # circuito_id <chr>, circuito_nombre <lgl>, mesa_id <chr>, mesa_tipo <chr>,
## # mesa_electores <dbl>, cargo_nombre <chr>, agrupacion_id <dbl>,
## # agrupacion_nombre <chr>, lista_numero <dbl>, lista_nombre <chr>,
## # votos_tipo <chr>, votos_cantidad <dbl>
caba_paso <- read_csv("DATA/caba_paso21.csv") %>%
print() #solo para chequear e inspeccionar datos
## Rows: 321103 Columns: 22
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (12): eleccion_tipo, recuento_tipo, padron_tipo, distrito_nombre, seccio...
## dbl (7): año, distrito_id, seccion_id, mesa_electores, agrupacion_id, lista...
## lgl (3): seccionprovincial_id, seccionprovincial_nombre, circuito_nombre
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
## # A tibble: 321,103 × 22
## año eleccion_tipo recuento_tipo padron_tipo distrito_id distrito_nombre
## <dbl> <chr> <chr> <chr> <dbl> <chr>
## 1 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## 2 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## 3 2021 PASO PROVISORIO COMANDO 1 CIUDAD AUTÓNOMA DE…
## 4 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## 5 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## 6 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## 7 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## 8 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## 9 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## 10 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## # … with 321,093 more rows, and 16 more variables: seccionprovincial_id <lgl>,
## # seccionprovincial_nombre <lgl>, seccion_id <dbl>, seccion_nombre <chr>,
## # circuito_id <chr>, circuito_nombre <lgl>, mesa_id <chr>, mesa_tipo <chr>,
## # mesa_electores <dbl>, cargo_nombre <chr>, agrupacion_id <dbl>,
## # agrupacion_nombre <chr>, lista_numero <dbl>, lista_nombre <chr>,
## # votos_tipo <chr>, votos_cantidad <dbl>
Como veremos, tenemos dos tablas MUY similares, pero una es para las PASO y otra para las elecciones GENERALES. El tamaño de las bases es el mismo,
Con el print() podemos verificar que se tratan de elecciones generales y elecciones primarias
Ahora pongamos a prueba nuestros nuevos comandos:
¿Si quiero unir las elecciones primarias y unas elecciones generales, que comando debería utilizar tal y como están las bases?
#Opción A
bind_rows(caba_generales, caba_paso)
## # A tibble: 642,206 × 22
## año eleccion_tipo recuento_tipo padron_tipo distrito_id distrito_nombre
## <dbl> <chr> <chr> <chr> <dbl> <chr>
## 1 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## 2 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## 3 2021 PASO PROVISORIO COMANDO 1 CIUDAD AUTÓNOMA DE…
## 4 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## 5 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## 6 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## 7 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## 8 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## 9 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## 10 2021 PASO PROVISORIO NORMAL 1 CIUDAD AUTÓNOMA DE…
## # … with 642,196 more rows, and 16 more variables: seccionprovincial_id <lgl>,
## # seccionprovincial_nombre <lgl>, seccion_id <dbl>, seccion_nombre <chr>,
## # circuito_id <chr>, circuito_nombre <lgl>, mesa_id <chr>, mesa_tipo <chr>,
## # mesa_electores <dbl>, cargo_nombre <chr>, agrupacion_id <dbl>,
## # agrupacion_nombre <chr>, lista_numero <dbl>, lista_nombre <chr>,
## # votos_tipo <chr>, votos_cantidad <dbl>
#Opción B
bind_cols(caba_generales, caba_paso)
## New names:
## • `año` -> `año...1`
## • `eleccion_tipo` -> `eleccion_tipo...2`
## • `recuento_tipo` -> `recuento_tipo...3`
## • `padron_tipo` -> `padron_tipo...4`
## • `distrito_id` -> `distrito_id...5`
## • `distrito_nombre` -> `distrito_nombre...6`
## • `seccionprovincial_id` -> `seccionprovincial_id...7`
## • `seccionprovincial_nombre` -> `seccionprovincial_nombre...8`
## • `seccion_id` -> `seccion_id...9`
## • `seccion_nombre` -> `seccion_nombre...10`
## • `circuito_id` -> `circuito_id...11`
## • `circuito_nombre` -> `circuito_nombre...12`
## • `mesa_id` -> `mesa_id...13`
## • `mesa_tipo` -> `mesa_tipo...14`
## • `mesa_electores` -> `mesa_electores...15`
## • `cargo_nombre` -> `cargo_nombre...16`
## • `agrupacion_id` -> `agrupacion_id...17`
## • `agrupacion_nombre` -> `agrupacion_nombre...18`
## • `lista_numero` -> `lista_numero...19`
## • `lista_nombre` -> `lista_nombre...20`
## • `votos_tipo` -> `votos_tipo...21`
## • `votos_cantidad` -> `votos_cantidad...22`
## • `año` -> `año...23`
## • `eleccion_tipo` -> `eleccion_tipo...24`
## • `recuento_tipo` -> `recuento_tipo...25`
## • `padron_tipo` -> `padron_tipo...26`
## • `distrito_id` -> `distrito_id...27`
## • `distrito_nombre` -> `distrito_nombre...28`
## • `seccionprovincial_id` -> `seccionprovincial_id...29`
## • `seccionprovincial_nombre` -> `seccionprovincial_nombre...30`
## • `seccion_id` -> `seccion_id...31`
## • `seccion_nombre` -> `seccion_nombre...32`
## • `circuito_id` -> `circuito_id...33`
## • `circuito_nombre` -> `circuito_nombre...34`
## • `mesa_id` -> `mesa_id...35`
## • `mesa_tipo` -> `mesa_tipo...36`
## • `mesa_electores` -> `mesa_electores...37`
## • `cargo_nombre` -> `cargo_nombre...38`
## • `agrupacion_id` -> `agrupacion_id...39`
## • `agrupacion_nombre` -> `agrupacion_nombre...40`
## • `lista_numero` -> `lista_numero...41`
## • `lista_nombre` -> `lista_nombre...42`
## • `votos_tipo` -> `votos_tipo...43`
## • `votos_cantidad` -> `votos_cantidad...44`
## # A tibble: 321,103 × 44
## año...1 eleccion_tipo...2 recuento_tipo...3 padron_tipo...4 distrito_id...5
## <dbl> <chr> <chr> <chr> <dbl>
## 1 2021 PASO PROVISORIO NORMAL 1
## 2 2021 PASO PROVISORIO NORMAL 1
## 3 2021 PASO PROVISORIO COMANDO 1
## 4 2021 PASO PROVISORIO NORMAL 1
## 5 2021 PASO PROVISORIO NORMAL 1
## 6 2021 PASO PROVISORIO NORMAL 1
## 7 2021 PASO PROVISORIO NORMAL 1
## 8 2021 PASO PROVISORIO NORMAL 1
## 9 2021 PASO PROVISORIO NORMAL 1
## 10 2021 PASO PROVISORIO NORMAL 1
## # … with 321,093 more rows, and 39 more variables: distrito_nombre...6 <chr>,
## # seccionprovincial_id...7 <lgl>, seccionprovincial_nombre...8 <lgl>,
## # seccion_id...9 <dbl>, seccion_nombre...10 <chr>, circuito_id...11 <chr>,
## # circuito_nombre...12 <lgl>, mesa_id...13 <chr>, mesa_tipo...14 <chr>,
## # mesa_electores...15 <dbl>, cargo_nombre...16 <chr>,
## # agrupacion_id...17 <dbl>, agrupacion_nombre...18 <chr>,
## # lista_numero...19 <dbl>, lista_nombre...20 <chr>, votos_tipo...21 <chr>, …
Rta correcta: VEMOS EN CLASE y discutimos
dplyr tiene un potente grupo de operadores para unir tablas en función de una o más variables que compartan ambos datasets y que cuenten con registros únicos en sus observaciones, estas variables serán las claves primarias y foráneas. Es decir, entre una tabla y otra tabla existe una variable o más variables que permiten establecer una relación.
Pueden verlos de forma interactiva aquí
También puede representarse como una serie de diagramas de Venn de la siguiente forma:
Fuente: R4DS
Si alguna vez escuchaste oír de SQL, notarás que esto de los joins puede sonar familiar. Y sí, dplyr se inspiró en SQL.
Fuente: R4DS
Veamos unos ejemplos utilizando datos del portal de datos.gob.ar.
En este caso utilizaremos las bases que contienen el promedio diario de producción de gas y petróleo por provincia.
En primer lugar importaremos las bases y utilizaremos
print() para ver las primeras 10 filas
#Paquetes
library(tidyverse)
#Read data
petroleo <- read_csv("http://datos.energia.gob.ar/dataset/590d1284-fd6d-4686-afd8-b3da5d90a6e9/resource/a512fef1-e98e-44af-b940-76168a4bc523/download/produccin-de-petrleo-promedio-diaria-por-provincia.csv") %>%
print()
## Rows: 2025 Columns: 5
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): indice_tiempo, provincia
## dbl (3): anio, mes, produccion_petroleo_promedio_dia_m3
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
## # A tibble: 2,025 × 5
## anio mes indice_tiempo provincia produccion_petroleo_promedio_dia_m3
## <dbl> <dbl> <chr> <chr> <dbl>
## 1 2009 1 2009-01 Chubut 25615.
## 2 2009 1 2009-01 Estado Nacional 684.
## 3 2009 1 2009-01 Formosa 417.
## 4 2009 1 2009-01 Jujuy 46.5
## 5 2009 1 2009-01 La Pampa 3925.
## 6 2009 1 2009-01 La Rioja 0
## 7 2009 1 2009-01 Mendoza 15650.
## 8 2009 1 2009-01 Neuquén 22097.
## 9 2009 1 2009-01 Rio Negro 5885.
## 10 2009 1 2009-01 Salta 1662.
## # … with 2,015 more rows
gas <- read_csv("http://datos.energia.gob.ar/dataset/590d1284-fd6d-4686-afd8-b3da5d90a6e9/resource/3d37d4f3-9b65-488e-9e64-bcd7483719fa/download/produccin-de-gas-promedio-diaria-por-provincia.csv") %>%
print()
## Rows: 1992 Columns: 5
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): indice_tiempo, provincia
## dbl (3): anio, mes, produccion_gas_promedio_dia_mm3
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
## # A tibble: 1,992 × 5
## anio mes indice_tiempo provincia produccion_gas_promedio_dia_mm3
## <dbl> <dbl> <chr> <chr> <dbl>
## 1 2014 9 2014-09 Mendoza 6453.
## 2 2021 7 2021-07 Chubut 8063.
## 3 2019 1 2019-01 Jujuy 9.16
## 4 2011 2 2011-02 Formosa 72.0
## 5 2011 11 2011-11 La Pampa 1269.
## 6 2013 9 2013-09 San Juan 0
## 7 2021 6 2021-06 Santa Cruz 9545.
## 8 2016 10 2016-10 La Pampa 1019.
## 9 2018 8 2018-08 Tierra del Fuego 12112.
## 10 2016 3 2016-03 Estado Nacional 13075.
## # … with 1,982 more rows
Como podemos ver arriba, ambas bases son muy parecidas, cada observación es la producción promedio mensual de una jurisdicción.
Tenemos 2.025 observaciones para la producción de petróleo, y 1992 observaciones para la producción de gas.
Ahora bien, a fines prácticos de nuestro ejercicio nos quedaremos solo con los datos de producción de 2021 y haremos un par de consultas a nuestras bases.
# Paso 1, Filtamos nuestras bases.
petroleo_2021 <- petroleo %>%
filter(anio == 2021)
gas_2021 <- gas %>%
filter(anio == 2021)
Digamos que queremos saber que provincias productoras de petroleo en 2021 produjeron gas en el mismo año.
Podríamos resolver nuestra pregunta de la siguiente forma
left_join(petroleo_2021, gas_2021) %>% #primero hacemos un left join
select(provincia) %>% #seleccionamos solo la variable provincia
unique() #quedamos con casos únicos
## Joining, by = c("anio", "mes", "indice_tiempo", "provincia")
## # A tibble: 11 × 1
## provincia
## <chr>
## 1 Chubut
## 2 Estado Nacional
## 3 Formosa
## 4 Jujuy
## 5 La Pampa
## 6 Mendoza
## 7 Neuquén
## 8 Rio Negro
## 9 Salta
## 10 Santa Cruz
## 11 Tierra del Fuego
Y si queremos saber que provincias productoras de gas en 2021 producen petróleo?
Podríamos resolver nuestra pregunta de la siguiente forma
right_join(petroleo_2021, gas_2021) %>%
select(provincia) %>%
unique()
## Joining, by = c("anio", "mes", "indice_tiempo", "provincia")
## # A tibble: 11 × 1
## provincia
## <chr>
## 1 Chubut
## 2 Estado Nacional
## 3 Formosa
## 4 Jujuy
## 5 La Pampa
## 6 Mendoza
## 7 Neuquén
## 8 Rio Negro
## 9 Salta
## 10 Santa Cruz
## 11 Tierra del Fuego
Como vemos, las provincias productoras de petróleo son las mismas provincias productoras de gas… Pero podría haber sido distinto.
Dejaremos inner_join() y full_join() para
que puedan practicarlos luego.
Lo usamos cuando los nombres de las columnas no representan las variables sino que figuran como registros en las filas.
Fuente: DNME - Ministerio de Turismo y Deportes de la Nación
Ahora lo veamos con un ejemplo.
Primero crearemos una base de datos “de juguete”:
#Importamos paquetes
library(tidyverse)
library(janitor)
##
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
##
## chisq.test, fisher.test
### Armo base de datos
plantel <- tibble::tibble(Apellido.y.Nombre = c("Martinez, Lisandro","Messi, Lionel","Di María, Angel","Alvarez, Julian","Armani, Franco"),
Posicion = c("Defensor", "Delantero", "Delantero", "Delantero","Arquero"),
Club.actual = c("Manchester United", "Paris Saint Germain", "Juventus", "Manchester City","River Plate"),
Club.origen = c("Newell's Old Boys", "Barcelona", "Rosario Central", "River Plate","Ferro")) %>%
clean_names()
plantel
## # A tibble: 5 × 4
## apellido_y_nombre posicion club_actual club_origen
## <chr> <chr> <chr> <chr>
## 1 Martinez, Lisandro Defensor Manchester United Newell's Old Boys
## 2 Messi, Lionel Delantero Paris Saint Germain Barcelona
## 3 Di María, Angel Delantero Juventus Rosario Central
## 4 Alvarez, Julian Delantero Manchester City River Plate
## 5 Armani, Franco Arquero River Plate Ferro
Ahora aplicamos pivot_longer, ven el cambio?
plantel_largo <- plantel %>%
pivot_longer(cols = c(club_actual, club_origen),
names_to = "tipo_club",
values_to = "club")
plantel_largo
## # A tibble: 10 × 4
## apellido_y_nombre posicion tipo_club club
## <chr> <chr> <chr> <chr>
## 1 Martinez, Lisandro Defensor club_actual Manchester United
## 2 Martinez, Lisandro Defensor club_origen Newell's Old Boys
## 3 Messi, Lionel Delantero club_actual Paris Saint Germain
## 4 Messi, Lionel Delantero club_origen Barcelona
## 5 Di María, Angel Delantero club_actual Juventus
## 6 Di María, Angel Delantero club_origen Rosario Central
## 7 Alvarez, Julian Delantero club_actual Manchester City
## 8 Alvarez, Julian Delantero club_origen River Plate
## 9 Armani, Franco Arquero club_actual River Plate
## 10 Armani, Franco Arquero club_origen Ferro
Lo usamos cuando la observación de una unidad está distribuida en múltiples filas.
pivot_wider(table2, names_from = type, values_from = count)
Si queremos retrotraer nuestro ejemplo, como hacemos?
plantel_ancho <- plantel_largo %>%
pivot_wider(names_from = tipo_club,
values_from = club)
plantel_ancho
## # A tibble: 5 × 4
## apellido_y_nombre posicion club_actual club_origen
## <chr> <chr> <chr> <chr>
## 1 Martinez, Lisandro Defensor Manchester United Newell's Old Boys
## 2 Messi, Lionel Delantero Paris Saint Germain Barcelona
## 3 Di María, Angel Delantero Juventus Rosario Central
## 4 Alvarez, Julian Delantero Manchester City River Plate
## 5 Armani, Franco Arquero River Plate Ferro
Abrir RStudio y crear un nuevo proyecto de R.
Utilizar los datos de PASO y generales de las elecciones 2021 en CABA, y guardarlos en la carpeta “data” dentro del proyecto.
Calcular la cantidad de votos TOTALES en PASO y Generales de cada agrupación política en la categoría Diputado Nacional.
Tip: puedes usar filter(), select(), group_by() y summarise()
Calcular la cantidad de electores por comuna
Transformar la base de datos larga (cada agrupación política una fila) en una base ancha (cada agrupación política una columna)
Una vez finalizado el ejercicio, generar el reporte HTML con “Knit”.